#pragma once

#include <iostream>
#include <sys/epoll.h>
#include <unistd.h>

class Epoll
{
private:
    const static int defaultSize = 256;

public:
    // 创建epoll模型
    static int CreateEpoll()
    {
        int epfd = epoll_create(defaultSize);
        if(epfd <= 0) exit(5);
        return epfd;
    }

    static bool CtlEpoll(int epfd, int op, int sock, uint32_t events)
    {
        struct epoll_event ev;
        ev.events = events;
        ev.data.fd = sock; // ev.data是一个联合体,使用其中的文件描述符字段即可
        int ret = epoll_ctl(epfd, op, sock, &ev);
        return ret == 0;
    }

    static int WaitEpoll(int epfd, struct epoll_event* readyEvents, int maxEvents, int timeout)
    {
        // 如果底层就绪的事件有很多,readyEvents承装不下,可以分多次来拿取底层就绪的事件
        // epoll_wait的返回值是底层就绪的事件的个数,readyEvents是输出型参数
        // epoll_wait函数返回时,会将底层就绪的事件按照顺序放入到readyEvents
        // 数组中,一个有返回值个就绪的事件
        return epoll_wait(epfd, readyEvents, maxEvents, timeout);
    }    
};